/*
 * libSincroDirYArch.c
 *
 *  Created on: 26/12/2011
 *      Author: utn_so
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "tiposSincroDirYArch.h"

extern t_nodoSincro* lSincro;
extern pthread_mutex_t mutexUsandoListaSincro;

extern int8_t imprimirDebug;

void encolarNodoSincro(char* path) {
	t_nodoSincro* aux = (t_nodoSincro*) malloc(sizeof(t_nodoSincro));
	aux->path = (char*) malloc(strlen(path));
	memset(aux->path, '\0', strlen(path));
	strcpy(aux->path, path);
	aux->mutex = (pthread_mutex_t*) malloc(sizeof(pthread_mutex_t));
	pthread_mutex_init(aux->mutex, NULL);
	aux->sig = lSincro;
	lSincro = aux;
}

void desencolarNodoSincro() {
	if (lSincro != NULL) {
		t_nodoSincro* aux = lSincro;
		lSincro = lSincro->sig;
		free(aux);
	}
}

void vaciarListaSincro() {
	pthread_mutex_unlock(&mutexUsandoListaSincro);
	while (lSincro != NULL) {
		desencolarNodoSincro();
	}
	pthread_mutex_unlock(&mutexUsandoListaSincro);
}

void mutexEnListaSincro(char* path, pthread_mutex_t** mutex) {
	t_nodoSincro* aux = lSincro;
	int8_t encontrado = 0;
	while (aux != NULL && !encontrado) {
		if (strcmp(path, aux->path) == 0) {
			encontrado = 1;
		} else {
			aux = aux->sig;
		}
	}
	*mutex = aux->mutex;
}

void empiezoATrabajarEnPath(char* path) {
	pthread_mutex_lock(&mutexUsandoListaSincro);
	t_nodoSincro* aux = lSincro;

	if (imprimirDebug) {
		/**/printf("Busco el nodo con path [%s].\n", path);
	}
	int8_t encontrado = 0;
	while (aux != NULL && !encontrado) {
		if (imprimirDebug) {
			/**/printf("Encontre el path [%s].\n", aux->path);
		}
		if (strcmp(path, aux->path) == 0) {
			if (imprimirDebug) {
				/**/printf("Es el que buscaba.\n");
			}
			encontrado = 1;
		} else {
			if (imprimirDebug) {
				/**/printf("No es el que buscaba.\n");
			}
			aux = aux->sig;
		}
	}

	if (!encontrado) {
		if (imprimirDebug) {
			/**/printf("No lo encontre.\n");
		}
		encolarNodoSincro(path);
	}
	pthread_mutex_t* mutex;
	mutexEnListaSincro(path, &mutex);
	pthread_mutex_unlock(&mutexUsandoListaSincro);
	pthread_mutex_lock(mutex);
}

void dejoDeTrabajarEnPath(char* path) {
	pthread_mutex_lock(&mutexUsandoListaSincro);
	t_nodoSincro* aux = lSincro;

	if (imprimirDebug) {
		/**/printf("Busco el nodo con path [%s].\n", path);
	}
	int8_t encontrado = 0;
	while (aux != NULL && !encontrado) {
		if (imprimirDebug) {
			/**/printf("Encontre el path [%s].\n", aux->path);
		}
		if (strcmp(path, aux->path) == 0) {
			if (imprimirDebug) {
				/**/printf("Es el que buscaba.\n");
			}
			encontrado = 1;
		} else {
			if (imprimirDebug) {
				/**/printf("No es el que buscaba.\n");
			}
			aux = aux->sig;
		}
	}

	if (!encontrado) {
		if (imprimirDebug) {
			/**/printf("No lo encontre.\n");
		}
		encolarNodoSincro(path);
	} else {
		if (imprimirDebug) {
			/**/printf("Lo encontre.\n");
		}
		pthread_mutex_t* mutex;
		mutexEnListaSincro(path, &mutex);
		pthread_mutex_unlock(&mutexUsandoListaSincro);
		pthread_mutex_unlock(mutex);
	}
}
